#ifndef AUDIO_STREAM_TTS_THREAD_H
#define AUDIO_STREAM_TTS_THREAD_H

#include "audio_dataset.h"
#include "audio_stream_tts.h"
#include <string>
#include <queue>
#include <memory>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <mutex>
#include <functional>
#include <condition_variable>
#include <thread>
#include "conf.h"
#include "utils/cJSON.h"

class TtsThread {
public:
    // 构造函数
    TtsThread();

    // 析构函数
    ~TtsThread();

    // 添加文本到队列，所有添加的文本都会被 tts 合成
    // text 是要合成的文本
    void appendText(const std::string& text);

    // 检查文本缓冲区是否为空
    bool bufferEmpty(void) {
        std::unique_lock<std::mutex> lock(queue_mutex_);

        bool retval = audio_dataset_.remainSize() <= 0;
        
        lock.unlock();

        return retval;
    }

    // 检查语音缓冲区是否为空
    bool audioBufferEmpty(void) {
        return audio_player_.audio_buffer_empty();
    }

    // 停止播放语音
    void audioStop(void) {
        audio_player_.stop();
    }

    // 开始播放语音
    void audioStart(void) {
        audio_player_.start();
    }

    void notifyInputFinished(void) {
        audio_dataset_.setPostDone(true);
        appendText("。");  // 保证最后一句必定结束
    }

    void setBufferTransitionToEmptyCallback(std::function<void(void)> func) {
        audio_player_.setBufferTransitionToEmptyCallback(func);
    }

    void textBufferReset(void) {
        audio_dataset_.reset();
    }

    void clearAudioBuffer(void) {
        audio_player_.clearAudioBuffer();
    }

    void fillSilence(void) {
        audio_player_.fillSilence();
    }

    void manualRunTransitionToEmptyCB(void) {
        audio_player_.manualRunTransitionToEmptyCB();
    }

    void setMute(bool mute) {
        audio_player_.setMute(mute);
    }

    bool mute(void) {
        return audio_player_.mute();
    }


private:
    bool exitFlag = false;

    // TTS 线程函数
    void ttsThread();

    // TTS 引擎
    TtsEngine tts_engine_;

    // 音频播放器
    AudioPlayer audio_player_;

    // 音频数据队列
    std::queue<std::string> audio_queue_;

    // 互斥锁
    std::mutex queue_mutex_;

    // 条件变量
    std::condition_variable cv_;

    // TTS 线程
    std::thread tts_thread_;

    // 音频数据集
    AudioDataset audio_dataset_;

};

#endif // AUDIO_STREAM_TTS_THREAD_H
